---
# Документация

# Документация и описание кода работы с внешней БД PostgreSQL
# Данный код выполняется на мащине с внешней БД PostgreSQL для создания схемы пользователя, шаблона пользователя, схемы шаблона и базы данных
# Для использования данной роли необходимо наличие ssh доступа к мащине с БД PostgreSQL
# Для использования данной роли необходимо наличие утилиты psql на мащине с БД PostgreSQL для создания схемы пользователя, шаблона пользователя, схемы шаблона и базы данных

# Анотация к коду работы с внешней БД PostgreSQL
# Данная роль подключается к внешней БД PostgreSQL вызывается через ansible glaxy и создает схемы пользователя, шаблона пользователя, схемы шаблона и базы данных
# vars - переменные для создания схемы пользователя, шаблона пользователя, схемы шаблона и базы данных могут наследоваться из основного playbook - stand_pprb

# задать пароль пользователя postgres через утилиту psql
# psql -d postgres -U postgres -c "ALTER USER postgres WITH PASSWORD 'postgres';"
# Создать пользователя psql в БД postgres через утилиту psql и задать пароль
# psql -d postgres -U postgres -c "CREATE USER psql WITH PASSWORD 'psql';"
# выдать права на роль postgres пользователю USER_PPRB в БД postgres через утилиту psql
# psql -d postgres -U postgres -c "GRANT postgres TO USER_PPRB;"
# Выдать все права на роль postgres пользователю USER_PPRB в БД postgres через утилиту psql
# psql -d postgres -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE postgres TO USER_PPRB;"
# необходимо выполнить на мащине с БД postgres

# задать пароль пользователю user_pprb
# psql -d postgres -U postgres -c "ALTER USER user_pprb WITH PASSWORD 'user_pprb';"
# выдать права на роль postgres пользователю USER_PPRB в БД postgres через утилиту psql
# psql -d postgres -U postgres -c "GRANT postgres TO USER_PPRB;"
# Выдать все права на роль postgres пользователю USER_PPRB в БД postgres через утилиту psql
# psql -d postgres -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE postgres TO USER_PPRB;"

#- name: install python-psycopg2 # необходима установка python-psycopg2 на магине исполнителе ansible task
#  yum:
#    name: python-psycopg2, libpq-devel, postgresql-devel
#  become: yes
##  become_user: ansible

# TODO - Указать роль в ansible-galaxy проекта stand-pprb
# TODO - Создать в playbook stand-pprb обращние к роле и указать переменные по умолчанию в нем или закоментировать для справки
# TODO - Редактирование роли для ее использования на удаленной машине а не в контейнере
# TODO - задать в inventory хост postgres

# TODO - мигрировать данные в ext postgres и создать шаблоны

- name: >
    Проверка доступности БД /
    Создание БД пользователя и схемы / 
    Cоздание DUMP File DB / DUMP File Schema User / DUMP File Schema Template/
    Воссстановеление схемы пользователя из DUMP File Schema Template /
    Восстановление схемы шаблона /
  block:
    - name: Проверка доступности БД / Cоздание БД
      block:
        #    - name: Добавление сетевого доступа к БД в pg_hba.conf для host postgres # Необходимо наличие ssh доступа к мащине с БД
        #      postgresql_pg_hba:
        #        dest: /var/lib/postgresql/data/pg_hba.conf
        #        contype: host
        #        users: "{{item}}"
        #        source: 0.0.0.0/0
        #        databases: "{{database_name}}"
        #        method: md5
        #        create: true
        #      with_items:
        #        - "{{database_user}}"
        #        - "{{database_template_user}}"
        #      delegate_to: postgres

        # Для отладки на Docker
        # Создание БД и назначение владельца схемы
        - name: "Создание БД и назначение владельца схемы в БД {{database_name}}"
#          environment:
#            PGOPTIONS: "-c password_encryption=scram-sha-256"
          postgresql_db:
            name: "{{database_name}}"
            encoding: UTF-8
            #    owner: my_user
            #    priv: "CONNECT/my_database:ALL"
            state: present
            login_host: "{{login_database_host}}"
            login_port: "{{login_database_port}}"
            login_user: "{{login_database_user}}"
            # пароль был задан ALTER USER postgres WITH ENCRYPTED PASSWORD 'user_pprb';
            login_password: "{{login_database_password}}"
#            ssl_mode: allow
#            connect_params:
#              # весь перечень параметров для connect_params
#              password_encryption: scram-sha-256
          when:
            - create_database is defined
            - create_database == true
        # fixme - необходимо авторизоваваться по паролю с шифрованием где используется ENCRYPTED PASSWORD


        - name: "Проверка доступности БД  {{login_database_host}}:{{login_database_port}}/{{database_name}}"
#          environment:
#            PGOPTIONS: "-c password_encryption=scram-sha-256"
          postgresql_ping:
            db: "{{database_name}}"
            login_host: "{{login_database_host}}"
            login_port: "{{login_database_port}}"
            login_user: "{{login_database_user}}"
            login_password: "{{login_database_password}}"
          notify:
            - ping_db_result
#            connect_params:
#              password_encryption: scram-sha-256"
#            method: scram-sha-256
#          login_auth_method: scram-sha-256
          register: ping_result
        - name: "Доступность БД {{login_database_host}}:{{login_database_port}}/{{database_name}}"
          debug:
            msg: "Подключение к БД {{login_database_host}}:{{login_database_port}}/{{database_name}} прошло успешно"
          when: ping_result.is_available == true
        - fail:
            msg: "Подключение к БД {{login_database_host}}:{{login_database_port}}/{{database_name}} не прошло"
          when: ping_result.is_available == false

    - name: Пользователь/Шаблонный, Схема, Удаление/Создание в БД
      block:
        - name: Удаление Шаблонной Схемы и пользователя Шаблонной Схемы из БД
          block:
            - name: Завершение сессий пользователя {{database_template_user}} к схеме {{database_template_schema_name}}
              postgresql_query:
                db: "{{database_name}}"
                query: "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '{{database_template_schema_name}}' AND pid <> pg_backend_pid();"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Удаление Шаблонной Схемы {{database_template_schema_name}} из БД {{database_name}}"
              postgresql_schema:
                name: "{{database_template_schema_name}}"
                db: "{{database_name}}"
                state: absent
                cascade_drop: yes
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Удаление пользователя {{database_template_user}} из БД {{database_name}}"
              postgresql_user:
                db: "{{database_name}}"
                name: "{{database_template_user}}"
                state: absent
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
              ignore_errors: yes
          when:
            - drop_template_schema is defined # Необходимо пользователям дать возможность удалить шаблонную схему или нет.
            - drop_template_schema | bool

        - name: Удаление схемы и пользователя
          block:
            - name: Завершение сессий пользователя {{database_user}} к схеме {{database_schema_name}}
              postgresql_query:
                db: "{{database_name}}"
                query: "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '{{database_schema_name}}' AND pid <> pg_backend_pid();"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Удаление Схемы {{database_schema_name}} из БД {{database_name}}"
              postgresql_schema:
                name: "{{database_schema_name}}"
                db: "{{database_name}}"
                state: absent
                cascade_drop: yes
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Удаление пользователя {{database_user}} из БД {{database_name}}"
              postgresql_user:
                db: "{{database_name}}"
                name: "{{database_user}}"
                state: absent
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
              ignore_errors: yes
          when:
            - drop_user_schema is defined # Необходимо пользователям дать возможность удалить шаблонную схему или нет.
            - drop_user_schema | bool

        - name: Создание Шаблонной Схемы и Пользователя Шаблонной Схемы, назначение владельцем
          block:
            - name: "Создание пользователя {{database_template_user}} в БД {{database_name}}"
              postgresql_user:
                db: "{{database_name}}"
                name: "{{database_template_user}}"
                password: "{{database_template_password}}"
                state: present
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Создание схемы {{database_template_schema_name}}, владелец {{database_template_user}} в БД {{database_name}}"
              postgresql_schema:
                name: "{{database_template_schema_name}}"
                db: "{{database_name}}"
                owner: "{{database_template_user}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Предоставление владения схемой {{database_template_schema_name}} пользователю {{database_template_user}}"
              postgresql_privs:
                database: "{{database_name}}"
#                schema: "{{database_template_schema_name}}"
                privs: "ALL"
                objs: "{{database_template_user}}"
                type: schema
                roles: "{{database_template_user}}"
                grant_option: yes
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            # grant postgres to database_template_user
            - name: Alter role {{database_template_user}} with superuser
              postgresql_query:
                db: "{{database_name}}"
                query: "ALTER ROLE {{database_template_user}} SUPERUSER;"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: Тестовое подключение к БД {{database_name}} для проверки создания Шаблонной Схемы и Пользователя Шаблонной Схемы
              postgresql_db:
                name: "{{database_name}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{database_template_user}}"
                login_password: "{{database_template_user}}"
          rescue:
            - name: Создание Шаблонной Схемы и Пользователя Шаблонной Схемы, назначение владельцем
              fail:
                msg: "Схема не создана, т/к не создан пользователь"
              when:
                - create_template_user == false
          when:
            - create_template_schema is defined # по умолчанию шаблонная схема создается, используется как проверка наличия шаблонной схемы
            - create_template_schema | bool

        - name: Создание Схемы и Пользователя, назначение владельцем
          block:
            - name: "Создание пользователя {{database_user}} в БД {{database_name}}"
              postgresql_user:
                db: "{{database_name}}"
                name: "{{database_user}}"
                password: "{{database_password}}"
                state: present
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Создание схемы {{database_schema_name}}, владелец {{database_user}} в БД {{database_name}}"
              postgresql_schema:
                name: "{{database_schema_name}}"
                db: "{{database_name}}"
                owner: "{{database_user}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            # Предоставление владения схемой пользователю
            - name: "Предоставление прав владения схемой {{database_schema_name}} пользователю {{database_user}}"
              postgresql_privs:
                database: "{{database_name}}"
                # schema: my_schema
                privs: "ALL"
                objs: "{{database_schema_name}}"
                type: schema
                roles: "{{database_user}}"
                grant_option: yes
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: Alter role {{database_user}} with superuser
              postgresql_query:
                db: "{{database_name}}"
                query: "ALTER ROLE {{database_user}} SUPERUSER;"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: Тестовое подключение к БД {{database_name}} для проверки создания Схемы и Пользователя
              postgresql_db:
                name: "{{database_name}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{database_user}}"
                login_password: "{{database_password}}"
          rescue:
            - name: "Создание пользователя {{database_user}} в БД {{database_name}} не удалось"
              fail:
                msg: "Создание пользователя {{database_user}} в БД {{database_name}} не удалось"
#              when:
#                - create_user == false
          when:
            - create_user_schema is defined # по умолчанию пользователя создается, используется как проверка наличия схемы пользователя
            - create_user_schema | bool

    - name: Создание дамп файла схемы и БД
      block:

        - name: Создание Dump File Схемы Шаблонной
          block:
            - name: "Тестовое подключение к БД {{database_name}} для проверки создания Шаблонной Схемы и Пользователя"
              postgresql_db:
                name: "{{database_name}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{database_template_user}}"
                login_password: "{{database_template_user}}"
            - name: "Удаление старого Dump File Schema Template {{dump_template_schema_file}}"
              file:
                path: "{{dump_template_schema_file}}"
                state: absent  # Удалить старый файл дампа шаблонной схемы, если он существует
            - name: "Создание каталога для Dump FIle Schema Template {{dump_template_schema_path}}"
              file:
                path: "{{dump_template_schema_path}}"
                state: directory  # Создать каталог для файла дампа шаблонной схемы
            - name: "Создание Dump File Schema Template {{dump_template_schema_file}}"
              postgresql_db:
                name: "{{database_name}}"
                state: dump  # Создать дамп шаблонной схемы базы данных
                target: "{{dump_template_schema_file}}"
                target_opts: "-n {{database_template_schema_name}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
              notify:
                - create_template_file
          rescue:
            - name: Создание Dump File Schema Template не удалось
              fail:
                msg: "Создание Dump File Schema Template не удалось т/к схемы шаблона не существует"
              when:
                - create_template_schema == false
          when:
            - dump_database_template_schema is defined
            - dump_database_template_schema | bool # Проверить, требуется ли создание дампа шаблонной схемы

        - name: Создание Dump File Пользовательной Схемы
          block:
            - name: "Тестовое подключение к БД {{database_name}} для проверки создания Схемы и Пользователя"
              postgresql_db:
                name: "{{database_name}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{database_user}}"
                login_password: "{{database_password}}"
            - name: "Удаление старого Dump File Schema User {{dump_schema_user_file}}"
              file:
                path: "{{dump_schema_user_file}}"
                state: absent  # Удалить старый файл дампа пользовательской схемы, если он существует
            - name: "Создание каталога для Dump FIle Schema User {{dump_schema_user_path}}"
              file:
                path: "{{dump_schema_user_path}}"
                state: directory  # Создать каталог для файла дампа пользовательской схемы
            - name: "Создание Dump File Schema User {{dump_schema_user_file}}"
              postgresql_db:
                name: "{{database_name}}"
                state: dump  # Создать дамп пользовательской схемы базы данных
                target: "{{dump_schema_user_file}}"
                target_opts: "-n {{database_schema_name}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
          rescue:
            - name: Создание Dump File Schema User не удалось
              fail:
                msg: "Создание Dump File Schema User не удалось, т/к пользовательской схемы не существует"
              when:
                - create_user_schema == False
          when:
            - dump_database_user_schema is defined
            - dump_database_user_schema | bool  # Проверить, требуется ли создание дампа пользовательской схемы

        - name: Создание Dump File всей БД
          block:
            - name: "Удаление старого Dump File БД {{dump_database_file}}"
              file:
                path: "{{dump_database_file}}"
                state: absent  # Удалить старый файл дампа базы данных, если он существует
            - name: "Создание каталога для Dump FIle БД {{dump_database_path}}"
              file:
                path: "{{dump_database_path}}"
                state: directory  # Создать каталог для файла дампа базы данных
            - name: "Создание Dump File БД {{dump_database_file}}"
              postgresql_db:
                name: "{{database_name}}"
                state: dump  # Создать дамп всей базы данных
                target: "{{dump_database_file}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
          rescue:
            - name: Создание Dump File БД не удалось
              fail:
                msg: "Создание Dump File БД не удалось"
              when:
                - create_database == false
          when:
            - dump_database is defined
            - dump_database | bool  # Проверить, требуется ли создание дампа базы данных

        - name: Копии дампов в каталог щаблона и в каталог пользователя
          block:
#            - name: Удаление файла пользователя
#              file:
#                path: "{{dump_schema_user_file}}"
#                state: absent  # Удалить старый файл дампа шаблона, если он существует
            - name: Копия дампа пользователя в каталог щаблона
              block:
                - name: Создание каталога щаблона для копии дампа пользователя
                  file:
                    path: "{{item}}"
                    state: directory
                  with_items:
                    - "{{dump_template_schema_path}}"
#                    - "{{dump_schema_user_path}}"
#                - name: Проверка наличия файла дампа пользователя
#                  stat:
#                    path: "{{dump_schema_user_file}}"
#                  register: dump_schema_user_file_stat
                - name: Копирование дампа пользователя в каталог щаблона если он существует
                  copy:
                    src: "{{dump_schema_user_file}}"
                    dest: "{{dump_template_schema_file}}"
                    remote_src: yes
#                  when: dump_schema_user_file_stat.stat.exists == true
              when:
                - copy_user_schema_file is defined
                - copy_user_schema_file | bool
            - name: Копия дампа шаблона в каталог пользователя
              block:
                -  name: Создание каталога пользователя для копии дампа шаблона
                   file:
                     path: "{{item}}"
                     state: directory
                   with_items:
                     - "{{dump_template_schema_path}}"
                     - "{{dump_schema_user_path}}"
#                - name: Проверка наличия файла дампа шаблона
#                  stat:
#                    path: "{{dump_template_schema_file}}"
#                  register: dump_template_schema_file_stat
                - name: Копирование дампа шаблона в каталог пользователя если он существует
                  copy:
                    src: "{{dump_schema_user_file}}"
                    dest: "{{dump_template_schema_file}}"
                    remote_src: yes
#                  when: dump_template_schema_file_stat.stat.exists == true
              when:
                - copy_template_schema_file is defined
                - copy_template_schema_file | bool

        - name: Поиск и удаление старых файлов дампов схем пользователя # в корневом каталоге файлов дампов дата создания которых превышает 2 месяца
          block:
            - name: Поиск устаревших файлов дампов схем пользователя {{dump_schema_user_path}}
              find:
                paths: "{{dump_schema_user_path}}"
                age: "2m" # 2 месяца
                recurse: yes
                file_type: file
              register: dump_files
            - debug:
                var: dump_files
            - name: Удаление устаревших файлов дампов схем пользователя {{dump_schema_user_path}}
              file:
                path: "{{item.path}}"
                state: absent
              with_items:
                - "{{dump_files.files}}"
          become: true

    - name: Восстановление схемы пользователя, шаблона и всей БД
      block:
        - name: "Восстановление Шаблонной схемы из файла дампа {{dump_template_schema_file}}"
          block:
            - name: "Восстановление Шаблонной схемы из файла дампа {{dump_template_schema_file}}"
              postgresql_db:
                name: "{{database_name}}"
                state: restore
                target: "{{dump_template_schema_file}}"
                target_opts: "-n {{database_template_schema_name}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Выдача прав Шаблонному пользователю {{database_template_user}} с привелегиями ALL на схему {{database_template_schema_name}}"
              postgresql_privs:
                database: "{{database_name}}"
#                schema: "{{database_template_schema_name}}"
                privs: "ALL"
                objs: "{{database_template_schema_name}}"
                type: schema
                roles: "{{database_template_user}}"
                grant_option: yes
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
          rescue:
            # Если восстановление шаблонной схемы не требуется, то не выполнять блок восстановления шаблонной схемы
            - name: Восстановление Шаблонной схемы не возможно
              fail:
                msg: "Восстановление Шаблонной схемы не возможно"
              when: "(drop_template_schema == false or create_template_schema == false) or restore_template_schema == true"
          when:
            - restore_template_schema is defined # Необходимо восстановить шаблонную схему, если она существует
            - restore_template_schema | bool

        - name: "Восстановление пользовательной схемы из файла дампа шаблона {{dump_template_schema_file}}"
          block:
            - name: "Восстановление пользовательной схемы из файла дампа шаблона {{dump_template_schema_file}}"
              postgresql_db:
                name: "{{database_name}}"
                state: restore
                target: "{{dump_template_schema_file}}"
                target_opts: "-n {{database_schema_name}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Выдача прав пользователю {{database_user}} с привелегиями ALL на схему {{database_schema_name}}"
              postgresql_privs:
                database: "{{database_name}}"
    #            schema: "{{database_schema_name}}"
                privs: "ALL"
                objs: "{{database_schema_name}}"
                type: schema
                roles: "{{database_user}}"
                grant_option: yes
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
          rescue:
            - name: Восстановление пользовательной схемы не возможно
              fail:
                msg: "Восстановление пользовательной схемы из файла дампа шаблона не возможно"
              when: "(drop_user_schema == false or create_user_schema == false) and restore_user_schema_template == true"
          when:
            - restore_user_schema_template is defined # Необходимо восстановить пользовательскую схему, если она существует
            - restore_user_schema_template | bool

        - name: "Восстановление пользовательной схемы из файла дампа {{dump_schema_user_file}}"
          block:
            - name: "Восстановление пользовательной схемы из файла дампа {{dump_schema_user_file}}"
              postgresql_db:
                name: "{{database_name}}"
                state: restore
                target: "{{dump_schema_user_file}}"
                target_opts: "-n {{database_schema_name}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Выдача прав пользователю {{database_user}} с привелегиями ALL на схему {{database_schema_name}}"
              postgresql_privs:
                database: "{{database_name}}"
    #            schema: "{{database_schema_name}}"
                privs: "ALL"
                objs: "{{database_schema_name}}"
                type: schema
                roles: "{{database_user}}"
                grant_option: yes
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
          rescue:
            - name: Восстановление пользовательной схемы не возможно
              fail:
                msg: "Восстановление пользовательной схемы из файла дампа {{dump_schema_user_file}} не возможно"
              when: "(drop_user_schema == false or create_user_schema == false) and restore_user_schema == true"
          when:
#            - restore_user_schema_template is defined  # Необходимо восстановить пользовательскую схему, если она существует
#            - restore_user_schema_template == false
            - restore_user_schema is defined # Необходимо восстановить пользовательскую схему, если она существует
            - restore_user_schema | bool

        - name: Восстановление всей БД c закрытием всех пользлвательских сессий
          block:
            - name: Проверка доступности файла дампа БД
              block:
                - name: Проверка сушествования файла дампа БД для дальнейшего использования в восстановлении
                  stat:
                    path: "{{dump_database_file}}"
                  register: dump_database_file_stat
                - fail:
                    msg: "Восстановление не возможно. Возможно не существует файла {{dump_database_file}}"
                  when: dump_database_file_stat.exists is false
            - name: "Создание БД {{database_name}}_testrestoredump"
              postgresql_db:
                name: "{{database_name}}_testrestoredump"
                state: present
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Восстановление БД {{database_name}}_testrestoredump"
              postgresql_db:
                name: "{{database_name}}_testrestoredump"
                state: restore
                target: "{{dump_database_file}}"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Проверка доступности БД {{database_name}}_testrestoredump"
              postgresql_ping:
                db: "{{database_name}}_testrestoredump"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: Закрытие всех сессий
              postgresql_query:
                db: "{{database_name}}"
                query: "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '{{database_name}}' AND pid <> pg_backend_pid();"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
              register: result_close_all_sessions
            - name: Вывод результата закрытия всех сессий
              debug:
                msg: "{{result_close_all_sessions}}"
            - name: "Удаление БД {{database_name}}"
              postgresql_db:
                name: "{{database_name}}"
                state: absent
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: Восстановление всей БД
              postgresql_db:
                name: "{{database_name}}"
                state: present
                owner: "{{login_database_user}}"
#                target: "{{dump_schema_user_file}}"
#                target_opts: "-n {{database_schema_name}}"
                template: "{{database_name}}_testrestoredump"
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
            - name: "Удаление БД {{database_name}}_testrestoredump"
              postgresql_db:
                name: "{{database_name}}_testrestoredump"
                state: absent
                login_host: "{{login_database_host}}"
                login_port: "{{login_database_port}}"
                login_user: "{{login_database_user}}"
                login_password: "{{login_database_password}}"
          when:
            - restore_database is defined # Необходимо восстановить БД, если она существует
            - restore_database | bool
...

#



#      when:
#        - drop_user_schema is defined
#        - drop_user_schema | bool
#        - create_user_schema is defined
#        - create_user_schema | bool
#        - restore_user_schema is defined
#        - restore_user_schema | bool


## удаление всех ранее созданных пользователей database_user не указанных в переменных программы "pprb_user_{{stand_name}}" предварительно запросить всех пользователей в БД
#- name: Запросить перечень всех пользователей в БД {{database_name}} pprb_user_{{stand_name}} и щаблоного пользователя {{database_template_user_name}}
#  block:
#    - name: "Запросить перечень всех пользователей в БД {{database_name}} pprb_user_{{stand_name}}"
#      postgresql_db:
#        name: "{{database_name}}"
#        state: list
#        login_host: "{{login_database_host}}"
#        login_port: "{{login_database_port}}"
#        login_user: "{{login_database_user}}"
#        login_password: "{{login_database_password}}"
#    - name: "Запросить щаблоного пользователя {{database_template_user_name}}"
#      postgresql_db:
#        name: "{{database_name}}"
#        state: list
#        target_opts: "-n {{database_template_user_name}}"
#        login_host: "{{login_database_host}}"
#        login_port: "{{login_database_port}}"
#        login_user: "{{login_database_user}}"
#        login_password: "{{login_database_password}}"
#
#- name: "Восстановление всей БД из файла дампа {{restore_database_file}}"
#  postgresql_db:
#    name: "{{database_name}}"
#    state: restore
#    target: "{{restore_database_file}}"
#    login_host: "{{login_database_host}}"
#    login_port: "{{login_database_port}}"
#    login_user: "{{login_database_user}}"
#    login_password: "{{login_database_password}}"
#  when:
#    - restore_database is defined
#    - restore_database | bool
